package com.notes.algo.exam;

/**
 * @author
 * @Describe 假设你正在开发一个网络通信模块，其中一个子功能是校验用户输入的IP地址的合法性，IP地址格式可能是IPV4，也可能是IPV6。如果是有效的IPV4的地址，返回"IPV4"；如果是有效的IPV6地址，返回"IPV6"；如果不是有效的IP地址，返回"ERROR"。
 * @date
 */
public class Solution6 {
    public static void main(String[] args) {
        String queryIP = "2001:0db8:85a3:0:0:8A2E:0370:7334";
        String whatIp = isWhatIp(queryIP);
        System.out.println(whatIp);

        queryIP = "172.16.254.1";
        whatIp = isWhatIp(queryIP);
        System.out.println(whatIp);

        queryIP = "256.256.256.256";
        whatIp = isWhatIp(queryIP);
        System.out.println(whatIp);
    }

    public static String isWhatIp(String ip) {
        if (isIp4(ip)) {
            return "IPV4";
        }

        if (isIp6(ip)) {
            return "IPV6";
        }

        return "ERROR";
    }

    public static boolean isIp4(String ip) {
        if (!ip.contains(".")) {
            return false;
        }

        // limit=-1表示分隔符后面没有值时会继续分隔
        String[] ipArr = ip.split("\\.", -1);
        int len = ipArr.length;
        // 1.段位长度为4
        if (len != 4) {
            return false;
        }
        // 遍历每个段位处理
        for (int i = 0; i < len; i++) {
            String curI = ipArr[i];
            // 2.每个段位的长度大于0且最多为3
            if (curI.length() <= 0 || curI.length() > 3) {
                return false;
            }
            // 3.段位长度大于1时不能以0开始，即不能有前导0
            if (curI.length() > 1 && curI.charAt(0) == '0') {
                return false;
            }
            //  遍历段位处理
            for (int j = 0; j < curI.length(); j++) {
                // 4.每个段位由非数字组成
                if (curI.charAt(j) < '0' || curI.charAt(j) > '9') {
                    return false;
                }
            }

            // 5.每个段位最大值为255
            if (Integer.valueOf(curI) > 255) {
                return false;
            }
        }

        return true;
    }

    public static boolean isIp6(String ip) {
        if (!ip.contains(":")) {
            return false;
        }

        String[] ipArr = ip.split(":", -1);
        // 1.段位长度为8
        if (ipArr.length != 8) {
            return false;
        }

        // 遍历处理每个段位
        for (int i = 0; i < ipArr.length; i++) {
            String curI = ipArr[i];
            int curILen = curI.length();
            // 2.每个段位长度大于0且最多为4
            if (curILen == 0 || curILen > 4) {
                return false;
            }
            // 遍历每个段位
            for (int j = 0; j < curILen; j ++) {
                char curJ = curI.charAt(j);
                // 每个段位组成可以包含数字、小写英文字母( 'a' 到 'f' )和大写英文字母( 'A' 到 'F' )。
                // 在 xi 中允许前导零。
                if (!((curJ >= '0' && curJ <= '9') || (curJ >= 'a' && curJ <= 'f') || (curJ >= 'A' && curJ <= 'F'))) {
                    return false;
                }
            }
        }

        return true;
    }
}
